package JVM.第03篇_运行时内存篇;

/**
 * PC寄存器（程序计数器）
 *     程序计数器   所需的内存很少  线程私有  无垃圾回收
 *     native 计数器为零 因为native是c语言的  不归java管
 *   记录了方法之间的调用和执行情况  类似排版值日表
 *     用来存储下一条指令的地址   也是即将要执行的指令代码
 *     他是当前线程所执行的字节码的行号指示器
 *
 * 1.为了保证程序(在操作系统中理解为进程)能够连续地执行下去，
 * CPU必须具有某些手段来确定下一条指令的地址。
 * 而程序计数器正是起到这种作用，所以通常又称为指令计数器。
 * 2.在程序开始执行前，必须将它的起始地址，即程序的一条指令所在的内存单元地址送入PC，
 * 因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。
 * 当执行指令时，CPU将自动修改PC的内容，即每执行一条指令PC增加一个量，
 * 这个量等于指令所含的字节数，以便使其保持的总是将要执行的下一条指令的地址。
 * 3.由于大多数指令都是按顺序来执行的，所以修改的过程通常只是简单的对PC加1。
 * 4.当程序转移时，转移指令执行的最终结果就是要改变PC的值，此PC值就是转去的地址，以此实现转移。
 * 有些机器中也称PC为指令指针IP (Instruction Pointer) 。
 *
 * 小结:
 * 它是程序控制流的指示器，分支、循环、跳转、异常处理、线程恢复等基础功能
 * 都需要依赖这个计数器来完成。
 *
 * PC寄存器用来存储指向下一条指令的地址，也即将要执行的指令代码。
 * 执行引擎的字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
 *
 *
 * ●它是一块很小的内存空间，几乎可以忽略不记。也是运行速度最快的存储区域。
 * 不会随着程序的运行需要更大的空间。
 * ●在JVM规范中，每个线程都有它自己的程序计数器，是线程私有的，
 * 生命周期与线程的生命周期保持一致。
 * ●它是唯一 一个 在Java虚拟机规范中没有规定任何OutotMemoryError情况的区域。
 *
 * PC寄存器为什么会被设定为线程私有?
 * 我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法，
 * CPU会不停地做任务切换，这样必然导致经常中断或恢复，如何保证分毫无差呢?
 * 为了能够准确地记录各个线程正在执行的当前字节码指令地址，
 * 最好的办法自然是为每一个线程都分配一个PC寄存器，
 * 这样一来各个线程之间便可以进行独立计算，从而不会出现相互干扰的情况。
 *
 *
 *
 */
public class A_程序计数器也叫PC寄存器 {

}
